# Insertion Sort
原理是逐一將原始資料加入已排序好資料中,並逐一與已排序好的資料作比較,找到對的位置插入。
平均時間複雜度為: O (n²)
void insertionsort (int n, keytype S[]) { | |
index i, j; | |
keytype x; | |
for (i=2; i<=n; i++) { | |
x = S[i]; | |
j = i-1; | |
while (j > 0 && S[j] > x) { | |
S[j+1] = S[j]; | |
j--; | |
} | |
S[j+1] = x; | |
} | |
} |
# Selection Sort
原理是反覆從未排序數列中找出最小值,將它與左邊的數做交換。
平均時間複雜度為: O (n²)
void selectionsort(int n, keytype S[]) { | |
index i, j, smallest; | |
for (i=1; i<=n-1; i++) { | |
smallest = i; | |
for (j=i+1; j<=n; j++) { | |
if (S[j] < S[smallest]) smallest = j; | |
} | |
exchange S[i] amd S[smallest]; | |
} | |
} |
# Merge Sort
原理是會先將原始資料分割成兩個資料列,接著再將兩個資料繼續分割成兩個資料列,依此類推,直到無法再分割,也就是每組都只剩下一筆資料時,再兩兩合併各組資料,合併時也會進行該組排序,每次排序都是比較最左邊的資料,將較小的資料加到新的資料列中,依此類推,直到最後合併成一個排序好的資料列為止。
# Quick Sort
原理是先從原始資料列中找一個基準值 (Pivot),接著逐一將資料與基準值比較,小於基準值的資料放在左邊,大於基準值的資料放在右邊,再將兩邊區塊分別再找出基準值,重複前面的步驟,直到排序完為止。
void quicksort(index low, index high) { | |
index pivotpoint; | |
if (high > low) { | |
partition(low, high, pivotpoint); | |
quicksort(low, pivotpoint - 1); | |
quicksort(pivotpoint + 1, high); | |
} | |
} |
# Heap Sort
操作流程 (最大堆積為例):
- 將陣列轉換最大堆積 (Max Heap)
- 將 Root 與最後一個節點交換
- 將最後一個節點移除
- 將剩餘未排序完的節點重複 1~3 步驟,直到所有節點被移除,即完成排序。